LONGJMP

            
#include <setjmp.h>
void longjmp(env, value);
jmp_buf env;                  переменная,   в  которойхранится окружение
int value;                    значение,   возвращаемое при вызове setjmp.

Описание.
Функция longjmp восстанавливает состояние стека, ранее сохраненное в env функцией setjmp .
Функции setjmp и longjmp обеспечивают возможность выполнения нелокального (nonlocal ) перехода и обычно используются для передачи управления на выполнение обработки ошибок; восстанавливают код в ранее вызванной процедуре (без использования обычного вызова); возвращают условные обозначения.
Вызовом setjmp сохраняется текущее состояние стека в env. Последующий вызов longjmp восстанавливает сохраненное состояние и возвращает управление на указатель (точку входа), непосредственно следующий за соответствующим вызовом setjmp .
Выполнение возобновляется, когда вызов setjmp возвращает заданное value . Когда вызывается longjmp , значения всех переменных (за исключением переменных регистра) становятся доступными для процедуры, которая принимает управление и содержит значения этих переменных. Значения переменных регистра непредсказуемы.
Функция longjmp должна вызываться ранее функции, определяющей возврат setjmp . Если longjmp вызвана после функции, определяющей возврат setjmp, то может произойти непредсказуемое поведение программы.
Значение value , возвращаемое longjmp , должно быть ненулевым. Если для value задан аргумент 0, значение возврата заменяется значением 1.

Возвращаемое значение.
Возвращаемого значения нет.

Предупреждение!
Значения переменных регистра в процедуре, вызывающей setjmp , после выполнения longjmp не могут быть восстановлены к собственным значениям.

Пример:

            #include <stdio.h>
            #include <setjmp.h>
            jmp_buf mark;
            main()
                 {
                 if (setjmp(mark) != 0)
                 {   printf("longjmp has been called\n");
                     recover();
                     exit(1);
                  }
                 printf("setjmp has been called\n");
                 .
                 .
                 .
                 p();
                 .
                 .
                 .
                 }
            
            p()
                {
                int error = 0;
                .
                .
                .
                if (error != 0)
                   longjmp(mark, -1);
                .
                .
                .
                }
            
            recover()
                {
            
               /*  при  выходе из программы убедитесь, что файлы данных не
         будут запорчены */
               .
               .
               .
               }
               
Hosted by uCoz